import axios from 'axios';
import { ElMessageBox, ElMessage } from 'element-plus';
import { tansParams } from '@/utils/routeUtil';
// import { getToken } from '@/utils/auth';
import cache from '@/plugins/cache';
import useUserStore from '@/store/modules/userinfo';
import { normalCodes, errorCodes } from '@/utils/customCodes';
import { Local } from '@/utils/storage';

// 是否显示重新登录
export const isRelogin = { show: false };

// axios.defaults.headers['VERSION'] = 'LSH';
// 创建axios实例
const service = axios.create({
	// axios中请求配置有baseURL选项，表示请求URL公共部分
	baseURL: import.meta.env.VITE_APP_BASE_API,
	// 超时
	timeout: 60000,
});

// request拦截器
service.interceptors.request.use(
	(config) => {
		// console.log('config', config);
		// 是否需要设置 token
		if (import.meta.env.MODE !== 'development') {
			// 不是开发环境。删掉headers的VERSION
			config.headers['VERSION'] && delete config.headers['VERSION'];
		}

		const isToken = (config.headers || {}).isToken === false;
		// 是否需要防止数据重复提交
		const isRepeatSubmit = (config.headers || {}).repeatSubmit === false;
		if (Local.get('access_token') && !isToken) {
			config.headers['Authorization'] = 'Bearer ' + Local.get('access_token'); // 让每个请求携带自定义token 请根据实际情况自行修改
		}
		// get请求映射params参数
		if (config.method === 'get' && config.params) {
			let url = config.url + '?' + tansParams(config.params);
			url = url.slice(0, -1);
			config.params = {};
			config.url = url;
		}
		// 针对post和put请求的防抖节流功能，需要可解开注释
		if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
			const requestObj = {
				url: config.url,
				data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
				time: new Date().getTime(),
			};
			const sessionObj = cache.session.getJSON('sessionObj');
			if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
				cache.session.setJSON('sessionObj', requestObj);
			} else {
				const s_url = sessionObj.url; // 请求地址
				const s_data = sessionObj.data; // 请求数据
				const s_time = sessionObj.time; // 请求时间
				const interval = 1000; // 间隔时间(ms)，小于此时间视为重复提交
				if (
					config.url?.indexOf('/modules/abilityServer/queryAbilityServer') === -1 &&
					s_data === requestObj.data &&
					requestObj.time - s_time < interval &&
					s_url === requestObj.url
				) {
					// const message = '数据正在处理，请勿重复提交';
					// console.warn(`[${s_url}]: ` + message);
					// return Promise.reject(new Error(message));
				} else {
					cache.session.setJSON('sessionObj', requestObj);
				}
			}
		}
		return config;
	},
	(error) => {
		Promise.reject(error);
	}
);

// 响应拦截器
service.interceptors.response.use(
	(res) => {
		// 未设置状态码则默认成功状态
		const code: number = Number(res.data.code) || 0;
		// 获取错误信息
		const msg = res.data.msg || errorCodes[code] || errorCodes['default'];
		// 二进制数据则直接返回
		if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
			return res.data;
		}
		// else if (normalCodes.includes(code)) {
		// 	//过滤自定义返回码
		// 	return Promise.resolve(res.data);
		// }
		else {
			return Promise.resolve(res.data);
		}
	},
	(error) => {
		const status = Number(error.response?.status) || 200;
		const code: number = Number(error.response?.data?.code) || 0;
		let message = error.response?.data?.msg || errorCodes[status] || errorCodes['default'];
		if (status === 424) {
			if (!isRelogin.show) {
				isRelogin.show = true;
				ElMessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
					confirmButtonText: '重新登录',
					type: 'warning',
					closeOnClickModal: false,
					showCancelButton: false,
				})
					.then(() => {
						isRelogin.show = false;
						useUserStore().handleLogOut();
					})
					.catch((e) => {
						console.log('err---', e);
					});
			}

			return Promise.reject('无效的会话，或者会话已过期，请重新登录。');
		}
		if (status === 404) {
			ElMessage({
				message: '请求失败,404!',
				type: 'error',
			});
			return;
		}
		if (code === 1 || code === 413) {
			// code为1时，将错误弹出来
			message = message || '请求失败';
			ElMessage({
				message: message,
				type: 'error',
			});
			return Promise.reject(new Error(message));
		}
		// 数据正在处理
		// const str = error.toString();
		// if (str.indexOf('数据正在处理') > -1) {
		// 	ElMessage({
		// 		message: '数据正在处理，请勿重复提交！',
		// 		type: 'error',
		// 	});
		// }

		return Promise.reject(error);
	}
);

export default service;
